package com.hera.process.config.service.impl;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.hera.base.util.Constantes;
import com.hera.base.util.FiltroDTO;
import com.hera.process.config.dao.OptionDao;
import com.hera.process.config.dao.ProfileDao;
import com.hera.process.config.dao.ProfileOptionDao;
import com.hera.process.config.dao.SysUserDao;
import com.hera.process.config.domain.Option;
import com.hera.process.config.domain.Profile;
import com.hera.process.config.domain.ProfileOption;
import com.hera.process.config.service.SysUserService;
import com.hera.process.security.domain.User;

@Service("sysuserservice")
public class SysUserServiceImpl implements SysUserService {

	static final Logger logger = Logger.getLogger(SysUserServiceImpl.class);

	@Autowired
	private SysUserDao sysuserdao;
	
	
	
	@Autowired
	private ProfileDao	profileDao;

	@Autowired
	private OptionDao	optionDao;
	
	@Autowired
	private ProfileOptionDao	profileOptionDao;

	@Override
	public User findById(Long id) {

		return sysuserdao.findOne(id);
	}

	@Override
	public void update(User entity) {

		sysuserdao.save(entity);
	}

	@Override
	public void save(User entity) {
		sysuserdao.save(entity);

	}

	@Override
	public void delete(User entity) {
		sysuserdao.delete(entity);

	}

	@Override
	public List<User> findAll() {
		// TODO Auto-generated method stub
		return sysuserdao.findAll();
	}

	@Override
	public List<User> findAll(FiltroDTO filtroDTO) {
		// TODO Auto-generated method stub
		return sysuserdao.obtenerEntidadesPorFiltros(filtroDTO);
	}

	@Override
	public User validarUsuario(User userFiltro) {
		FiltroDTO filtrodto = new FiltroDTO();
		filtrodto.addParametro("userLogin", userFiltro.getUserLogin());
		List<User> lista = sysuserdao.obtenerEntidadesPorFiltros(filtrodto);
		if (lista.size() > 0) {
			User user = lista.get(0);
			user.getProfile().setOpciones(obtenerOpciones(user.getProfile()));
			if (user.getPassword().equals(userFiltro.getPassword())) {
				return user;
			}
		}
		return null;
	}

	
	public HashMap<Long, List<Option>> obtenerOpciones(Profile profile) {
		FiltroDTO filtroOpcionesDTO=new FiltroDTO();
		
		List<Option> lstOpciones=optionDao.obtenerEntidadesPorFiltros(filtroOpcionesDTO);
		
		HashMap<Long,List<Option>> opciones=new HashMap<Long, List<Option>>();
		FiltroDTO filtroOpcionXPerfil=new FiltroDTO();
		filtroOpcionXPerfil.addAlias("option");
		filtroOpcionXPerfil.addParametro("profile.idProfile", profile.getIdProfile());
		filtroOpcionXPerfil.addOrdenamientoAscendente("option.father.idOpcion");
		List<ProfileOption> lstOpcionRol=profileOptionDao.obtenerEntidadesPorFiltros(filtroOpcionXPerfil);
		
		
		List<Option> lstAuxiliar=null;
		for(Option opcion:lstOpciones){
			if(!exiteOpcion(lstOpcionRol, opcion)){continue;}
			if(opcion.getFather()==null){//ES PADRE
				if(opciones.get(Constantes.MENU.ROOT)==null){//NO EXISTE EN LA RAIZ
					lstAuxiliar=new ArrayList<Option>();
					lstAuxiliar.add(opcion);
					opciones.put(Constantes.MENU.ROOT, lstAuxiliar);	
				}else{//existe
					lstAuxiliar=opciones.get(Constantes.MENU.ROOT);
					lstAuxiliar.add(opcion);
					opciones.put(Constantes.MENU.ROOT, lstAuxiliar);	
				}
				
			}else{// ES HIJO
				if(opciones.get(opcion.getFather().getIdOpcion())==null){
					lstAuxiliar=new ArrayList<Option>();
					lstAuxiliar.add(opcion);
					opciones.put(opcion.getFather().getIdOpcion(), lstAuxiliar);
				}else{
					lstAuxiliar=(List<Option>)opciones.get(opcion.getFather().getIdOpcion());
					lstAuxiliar.add(opcion);
					opciones.put(opcion.getFather().getIdOpcion(), lstAuxiliar);
				}
				
			}
		}
		return opciones;
	}
	

	private boolean exiteOpcion(List<ProfileOption> lstOpcionRol,Option option) {
		for(ProfileOption opcionRol:lstOpcionRol){
			if(opcionRol.getOption().getIdOpcion().equals(option.getIdOpcion())){
				return true;
			}
		}
		return false;
	}
}
